home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************/
- /* SOURCE CODE FILE */
- /********************************************************************/
- /*
- * >>> File name: List Object
- *
- * >>> Purpose: A universally double list of other objects
- * >>> Project: PoopDraw
- * >>> Date: 2/20/89
- * >>> By: Adam Treister
- *
- */
- /********************************************************************/
- /* For Your Information 1802 Hillside Rd. SB CA 93101 */
- /********************************************************************/
-
-
- #include "PoopDrawInc"
-
- typedef struct
- {
- _StdObjectFields
- long **dataArray;
- int nElements;
- int index; /* keep track for next and prev calls */
-
- }
- ListObjectRec, *ListObjectPtr, **ListObject,**ListObjectHandle;
- #define BLOCKSIZE 32L
-
- /********************************************************************/
- private void ListDispatch(ListObject ObjectH,int Message,LPtr ParmP);
- ListObject NewListObject(void);
- private void AddObjToList(ListObject List, ObjectHandle ObjectH);
- private void AppendToList(ListObject List, ObjectHandle ObjectH);
- private void DelObjFromList(ListObject List, ObjectHandle ObjectH);
- private void FindObject (ListObject List,LPtr ParmP);
- private void Apply(ListObject List,int Message,LPtr ParmP);
- private void Dispose(ListObject List,LPtr ParmP);
- private long First(ListObject List);
- private long Next(ListObject List);
- private long Prev(ListObject List);
- private long Last(ListObject List);
-
- /********************************************************************/
-
- void ListDispatch(ObjectH,Message,ParmP)
- ListObject ObjectH;
- int Message;
- LPtr ParmP;
-
- {
- switch(Message)
- {
- case DISPOSE: Dispose(ObjectH,ParmP); break;
-
- case ADDOBJECT: AddObjToList(ObjectH,ParmP); break;
- case APPEND: AppendToList(ObjectH,ParmP); break;
- case DELOBJECT: DelObjFromList(ObjectH,ParmP); break;
-
- case FIND: FindObject(ObjectH,ParmP); break;
- case CLRSELECT:
- case ERASE: Apply(ObjectH,INVAL,ParmP);
- Apply(ObjectH,UNSELECT,ParmP);
- (*ObjectH)->nElements = 0; break;
-
- case GETSIZE: *ParmP = (long) (*ObjectH)->nElements;
- (*ObjectH)->index = -1; break;
- case FIRST: *ParmP = First(ObjectH); break;
- case NEXT: *ParmP = Next(ObjectH); break;
- case PREV: *ParmP = Prev(ObjectH); break;
- case LAST: *ParmP = Last(ObjectH); break;
-
- default: Apply(ObjectH,Message,ParmP);
- }
- }
- /********************************************************************/
-
- ListObject NewListObject()
- {
- ListObject list;
- list = _GetHandleToRecord(ListObjectRec);
- NullOutHandle(list);
- (*list)->dispatch = ListDispatch;
- (*list)->dataArray = NewHandle(BLOCKSIZE);
- (*list)->nElements = (*list)->index = 0; /* not nec. because of NullOut */
- (*list)->class = LIST;
- return(list);
- }
- /*------------------------------------------------------------------*/
-
- void Dispose(List,ParmP)
- ListObject List;
- LPtr ParmP;
- {
- long whatToKillFlag = (*ParmP);
- if (ODD(whatToKillFlag))
- {
- Apply(List,DISPOSE,NULL);
- (*List)->nElements = 0;
- }
- if (whatToKillFlag > 1)
- {
- DisposeHandle((*List)->dataArray);
- DisposeHandle(List);
- }
- }
- /* ============================================================ */
- /* */
- /* OBJECT LIST FUNCTIONS */
- /* */
- /* ============================================================ */
-
-
- /* ------------------------------------------------------------ */
- /* */
- /* AddObjToList */
- /* */
- /* This function adds the passed object to the dataArray */
- /* in the List's ObjectHandle. */
- /* */
- /* ------------------------------------------------------------ */
-
- void AddObjToList(List, ObjectH)
- ListObject List;
- ObjectHandle ObjectH;
- {
- Size size;
-
- size = GetHandleSize((*List)->dataArray);
- if (size == (*List)->nElements * sizeof(Handle)) /* all spaces are full, add more */
- SetHandleSize((*List)->dataArray,size + BLOCKSIZE);
-
- (*(*List)->dataArray)[(*List)->nElements++] = (long) ObjectH;
- }
- /* ------------------------------------------------------------ */
- /* */
- /* AddObjToList */
- /* */
- /* This function adds the passed object to the dataArray */
- /* in the List's ObjectHandle. */
- /* */
- /* ------------------------------------------------------------ */
-
- void AppendToList(List, ObjectH)
- ListObject List;
- ObjectHandle ObjectH;
- {
- Size size;
- LPtr array;
-
- size = GetHandleSize((*List)->dataArray);
- if (size == (*List)->nElements * sizeof(Handle)) /* all spaces are full, add more */
- SetHandleSize((*List)->dataArray,size + BLOCKSIZE);
-
- (*(*List)->dataArray)[(*List)->nElements++] = (long) ObjectH;
- array = (*(*List)->dataArray);
- BlockMove(array,array+1,(*List)->nElements * sizeof(Handle));
- (*(*List)->dataArray)[0] = (long) ObjectH;
- }
-
- /* ------------------------------------------------------------ */
- /* */
- /* DelObjFromWin */
- /* */
- /* Array Delete squeezing following elements downward */
- /* */
- /* ------------------------------------------------------------ */
-
- void DelObjFromList(List, ObjectH)
- ListObject List;
- ObjectHandle ObjectH;
-
- {
- Size size;
- LPtr adr, array;
- int i;
-
- array = (*(*List)->dataArray);
- size = GetHandleSize((*List)->dataArray);
-
- for (i=0; i < (*List)->nElements; i++)
- {
- if (array[i] == (long) ObjectH) /* found it!! */
- {
- adr = &array[i];
- BlockMove(adr+1,adr,size - (4L * (i+1))); /* adr+1 is 4 bytes past adr !!! */
- (*List)->nElements--;
- if (size > ((*List)->nElements * sizeof(Handle)) + BLOCKSIZE) /* reduce extra space */
- SetHandleSize((*List)->dataArray,size - BLOCKSIZE);
- return;
- }
- }
- }
- /* ------------------------------------------------------------ */
- /* */
- /* FindObject */
- /* */
- /* Like FindWindow or FindControl, this routine goes thru */
- /* a list, looking for a successful PtInRgn. It puts the */
- /* frontmost object satisfying the test in objHP */
- /* ------------------------------------------------------------ */
- int PtInDrawObjectHandle(Point pt,DrawObjectHandle ObjectH);
- Boolean PtInDrawObjectRegion(Point pt,ObjectHandle ObjectH);
-
- void FindObject(List,ParmP)
- ListObject List;
- LPtr ParmP;
- {
- ObjectHandle ObjectH;
- Point pt;
- int i;
- LPtr array;
- RgnHandle rgn;
- Boolean found = FALSE;
- int where;
-
- array = *(*List)->dataArray;
- pt = *(Point *)ParmP[0];
- for (i=(*List)->nElements-1; i >= 0 AND !found; i--)
- {
- ObjectH = (ObjectHandle) array[i];
- if (BitTst(&(*ObjectH)->attributes,SelectedBit))
- {
- where = PtInDrawObjectHandle(pt,ObjectH);
- if (where == 5)
- found = PtInDrawObjectRegion( pt, ObjectH);
- else found = where; /* true for interior or any handle */
- }
- else
- found = PtInDrawObjectRegion( pt, ObjectH);
- }
- ParmP[1] = (found) ? (long) ObjectH : NULL;
- }
- /*------------------------------------------------------------------*/
- Boolean PtInDrawObjectRegion( pt, ObjectH)
- Point pt;
- ObjectHandle ObjectH;
- {
- RgnHandle rgn;
- Boolean found = FALSE;
-
- rgn = NewRgn();
- OpenRgn();
- Dispatch(ObjectH,FRAME,NULL);
- CloseRgn(rgn);
- found = PtInRgn(pt,rgn);
- DisposeRgn(rgn);
- return(found);
- }
- /* ------------------------------------------------------------ */
- /* */
- /* Apply */
- /* */
- /* ------------------------------------------------------------ */
-
- void Apply(List, Message,ParmP)
- ListObject List;
- int Message;
- LPtr ParmP;
-
- {
- ObjectHandle ObjectH,next;
- int i;
- LPtr array;
-
- array = *(*List)->dataArray;
- for (i=0; i < (*List)->nElements; i++)
- {
- Dispatch((ObjectHandle)array[i],Message,ParmP);
- }
- }
- /*------------------------------------------------------------------*/
-
- long First(List)
- ListObject List;
- {
- return((*(*List)->dataArray)[0]);
- }
- /*------------------------------------------------------------------*/
- long Next(List)
- ListObject List;
- {
- if ((*List)->index >= (*List)->nElements-1)
- (*List)->index = 0;
- else (*List)->index++;
- return((*(*List)->dataArray)[(*List)->index]);
- }
- /*------------------------------------------------------------------*/
- long Prev(List)
- ListObject List;
- {
- if ((*List)->index <= 0)
- (*List)->index = (*List)->nElements-1;
- else (*List)->index--;
- return((*(*List)->dataArray)[(*List)->index]);
- }
- /*------------------------------------------------------------------*/
- long Last(List)
- ListObject List;
- {
- return((*(*List)->dataArray)[(*List)->nElements-1]);
- }
- /*------------------------------------------------------------------*/
-